/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.servinf.ani.comparator;

import com.servinf.ani.mapper.AssignmentMapper;
import com.servinf.ani.sincronizador.App;
import com.servinf.ani.sincronizador.entities.Intervencion;
import com.servinf.ani.sincronizador.exception.IncompatibleTypesException;
import com.servinf.ani.sincronizador.service.AssignmentService;
import com.servinf.ani.sincronizador.utils.LogHelper;
import java.io.IOException;
import java.util.List;

/**
 *
 * @author mortiz
 */
public class AssignmentComparator {
    
     /**
      * Compara uno a uno los registros del archivo de excel en asignaciones y lo compara con las intervenciones 
      * en la base de datos.
      * @param excelList
      * @param jpaList
      * @throws IOException 
      */
     public static void compareList(List<List<Object>> excelList, List<Intervencion> jpaList) throws IOException {
            LogHelper.Log(LogHelper.INFO, "Inicia sincronización de intervenciones Excel vs BD", null);
            AssignmentService assignmentService = (AssignmentService) App.getContext().getBean("assignmentService");
            for(int i = 1; i < excelList.size(); i++)  {  //Inicia en 1 porque la fila 0 es de header de las columnas.
                if(validateAssignmentNullable(excelList.get(i))) {
                    boolean found = false;
                    for(Intervencion assignment : jpaList) {
                        if(isEntityInDB(excelList.get(i), assignment)) {
                           LogHelper.Log(LogHelper.INFO, "ACTUALIZANDO la intervención " +  assignment.toString(), null);
                            try {
                                assignmentService.update(excelList.get(i), assignment);
                            } catch (IncompatibleTypesException ex) {
                               LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
                            }
                           found = true;
                           break;
                        }
                    }
                    if(found) {
                        continue;
                    }else {
                        LogHelper.Log(LogHelper.INFO, "CREANDO la intervención " + excelList.get(i).get(AssignmentMapper.IdDeLaAsignación) + " --> " + excelList.get(i).get(AssignmentMapper.NombreDeLaTarea), null);
                        try {
                            assignmentService.create(excelList.get(i), null);
                        } catch (IncompatibleTypesException ex) {
                           LogHelper.Log(LogHelper.ERROR, "Existen datos en la información del excel que no corresponden con el tipo de dato", ex);
                        }
                    }
                }
            }

         }
     
     
     
     /**
     * Mediante la comparación de ids de dos entidades (Excel vs DB) se determina si existe o si es un registro 
     * nuevo que debe crearse.
     * @param excelEntity Entidad leida desde excel
     * @param jpaEntity Entidad leida desde la base de datos.
     * @return 
     */
    public static boolean isEntityInDB(List<Object> excelEntity, Intervencion jpaEntity) {
        String excelId = "";
        if(excelEntity.get(AssignmentMapper.IdDeLaAsignación) != null) {
            excelId = (String) excelEntity.get(AssignmentMapper.IdDeLaAsignación);
        }
        String assignmentProjectOnlineId = jpaEntity.getIdIntervencionProject();
        boolean found = excelId.trim().equals(assignmentProjectOnlineId.trim());
        //System.out.println(excelId + " == " + projectOnlineId + "?");
        //System.out.println(((excelId.trim().equals(projectOnlineId.trim()))?"Si":"No"));
        return found;
    }

    private static boolean validateAssignmentNullable(List<Object> row) throws IOException {
        if(row.get(AssignmentMapper.Tramo_T) == null) {
            LogHelper.Log(LogHelper.ERROR, "No se puede crear la intervención [id = "+ (String) row.get(AssignmentMapper.IdDeTarea) + 
                    ", nombre = " + (String) row.get(AssignmentMapper.NombreDeLaTarea) + " ] porque no se especifica ningún tramo", null);
            return false;
        }
         if(row.get(AssignmentMapper.IdDeTarea) == null) {
            LogHelper.Log(LogHelper.ERROR, "No se puede crear la intervención [id = "+ (String) row.get(AssignmentMapper.IdDeTarea) + 
                    ", nombre = " + (String) row.get(AssignmentMapper.NombreDeLaTarea) + " ] porque el id es vacío", null);
            return false;
        }
         return true;
    }
}
